CODE 18. Distinct Subsequences

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2013/09/17/2013-09-17-CODE 18 Distinct Subsequences/

访问原文「CODE 18. Distinct Subsequences

Given a string S and a string T, count the number of distinct subsequences of T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is
a subsequence of "ABCDE" while "AEC" is
not).
Here is an example:
S = "rabbbit", T = "rabbit"
Return 3.
ps: sum(a, b) = (S.charAt(a)==T.charAt(b))*sum(a-1, b-1)+ sum(a-1, b)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public int numDistinct(String S, String T) {
// Start typing your Java solution below
// DO NOT write main() function
if (null == S || null == T || T.length() > S.length()) {
return 0;
}
if (S.equals(T)) {
return 1;
}
int[][] sum = new int[S.length()][T.length()];
if (S.charAt(0) == T.charAt(0)) {
sum[0][0] = 1;
}
for (int i = 1; i < S.length(); i++) {
if (S.charAt(i) == T.charAt(0)) {
sum[i][0] = 1 + sum[i - 1][0];
} else {
sum[i][0] = sum[i - 1][0];
}
}
for (int i = 1; i < S.length(); i++) {
for (int j = 1; j <= i && j < T.length(); j++) {
if (S.charAt(i) == T.charAt(j)) {
sum[i][j] = sum[i - 1][j] + sum[i - 1][j - 1];
} else {
sum[i][j] = sum[i - 1][j];
}
}
}
return sum[S.length() - 1][T.length() - 1];
}
Jerky Lu wechat
欢迎加入微信公众号